// 信号量的封装 -- 环形队列使用信号量实现同步机制

// 信号量组件 , 因为环形队列资源可以被分块,分批访问
// 信号量也是 : 阻塞 - 唤醒的机制  , 但是信号量的核心操作是 PV操作

// 防止头文件被重复包含
#pragma once

#include <iostream>
#include <semaphore.h>
#include <pthread.h>

namespace SemModule
{
    const int defaultvalue = 1;
    class Sem
    {
    public:
        Sem(unsigned int sem_value = defaultvalue)
        {
            sem_init(&_sem, 0, sem_value);
        }
        // P操作 -- 等待 , 就是信号量 --
        void P()
        {
            sem_wait(&_sem); // 原子的
        }
        //      //V操作 -- 唤醒 , 就是信号量 ++
        void V()
        {
            sem_post(&_sem); // 原子的
        }
        ~Sem()
        {
            sem_destroy(&_sem);
        }

    private:
        sem_t _sem;
    };
}